package com.zjcloud.jwgl.service;

import java.util.List;
import com.zjcloud.jwgl.domain.ScTimeSlot;

/**
 * 时间段信息Service接口
 * 
 * @author zjcloud
 * @date 2024-12-19
 */
public interface IScTimeSlotService 
{
    /**
     * 查询时间段信息
     * 
     * @param id 时间段信息主键
     * @return 时间段信息
     */
    public ScTimeSlot selectScTimeSlotById(Long id);

    /**
     * 查询时间段信息列表
     * 
     * @param scTimeSlot 时间段信息
     * @return 时间段信息集合
     */
    public List<ScTimeSlot> selectScTimeSlotList(ScTimeSlot scTimeSlot);

    /**
     * 新增时间段信息
     * 
     * @param scTimeSlot 时间段信息
     * @return 结果
     */
    public int insertScTimeSlot(ScTimeSlot scTimeSlot);

    /**
     * 修改时间段信息
     * 
     * @param scTimeSlot 时间段信息
     * @return 结果
     */
    public int updateScTimeSlot(ScTimeSlot scTimeSlot);

    /**
     * 批量删除时间段信息
     * 
     * @param ids 需要删除的时间段信息主键集合
     * @return 结果
     */
    public int deleteScTimeSlotByIds(Long[] ids);

    /**
     * 删除时间段信息信息
     * 
     * @param id 时间段信息主键
     * @return 结果
     */
    public int deleteScTimeSlotById(Long id);

    /**
     * 根据时间段编码查询时间段信息
     * 
     * @param timeSlotCode 时间段编码
     * @return 时间段信息
     */
    public ScTimeSlot selectScTimeSlotByCode(String timeSlotCode);

    /**
     * 检查时间段编码是否唯一
     * 
     * @param scTimeSlot 时间段信息
     * @return 结果
     */
    public String checkTimeSlotCodeUnique(ScTimeSlot scTimeSlot);

    /**
     * 根据星期几查询时间段列表
     * 
     * @param dayOfWeek 星期几
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByDayOfWeek(Integer dayOfWeek);

    /**
     * 根据节次查询时间段列表
     * 
     * @param period 节次
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByPeriod(Integer period);

    /**
     * 根据时间段类型查询时间段列表
     * 
     * @param timeSlotType 时间段类型
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByType(String timeSlotType);

    /**
     * 根据适用学段查询时间段列表
     * 
     * @param applicableStage 适用学段
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByApplicableStage(String applicableStage);

    /**
     * 获取可排课时间段列表
     * 
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectSchedulableTimeSlots();

    /**
     * 获取上午时间段列表
     * 
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectMorningTimeSlots();

    /**
     * 获取下午时间段列表
     * 
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectAfternoonTimeSlots();

    /**
     * 获取晚上时间段列表
     * 
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectEveningTimeSlots();

    /**
     * 根据优先级查询时间段列表
     * 
     * @param minPriority 最小优先级
     * @param maxPriority 最大优先级
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByPriority(Integer minPriority, Integer maxPriority);

    /**
     * 根据权重系数查询时间段列表
     * 
     * @param minWeight 最小权重
     * @param maxWeight 最大权重
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotByWeight(Double minWeight, Double maxWeight);

    /**
     * 检查时间段是否冲突
     * 
     * @param timeSlot1Id 时间段1ID
     * @param timeSlot2Id 时间段2ID
     * @return 结果
     */
    public boolean checkTimeSlotConflict(Long timeSlot1Id, Long timeSlot2Id);

    /**
     * 获取相邻时间段
     * 
     * @param timeSlotId 时间段ID
     * @return 相邻时间段列表
     */
    public List<ScTimeSlot> getAdjacentTimeSlots(Long timeSlotId);

    /**
     * 获取时间段统计信息
     * 
     * @param timeSlotId 时间段ID
     * @return 统计信息
     */
    public ScTimeSlot getTimeSlotStatistics(Long timeSlotId);

    /**
     * 更新时间段统计信息
     * 
     * @param timeSlotId 时间段ID
     * @return 结果
     */
    public int updateTimeSlotStatistics(Long timeSlotId);

    /**
     * 设置时间段可排课状态
     * 
     * @param timeSlotId 时间段ID
     * @param schedulable 是否可排课
     * @return 结果
     */
    public int setSchedulableStatus(Long timeSlotId, Boolean schedulable);

    /**
     * 批量设置时间段可排课状态
     * 
     * @param timeSlotIds 时间段ID列表
     * @param schedulable 是否可排课
     * @return 结果
     */
    public int batchSetSchedulableStatus(Long[] timeSlotIds, Boolean schedulable);

    /**
     * 根据特殊标记查询时间段列表
     * 
     * @param specialMark 特殊标记
     * @return 时间段列表
     */
    public List<ScTimeSlot> selectScTimeSlotBySpecialMark(String specialMark);

    /**
     * 批量导入时间段
     * 
     * @param timeSlotList 时间段列表
     * @param isUpdateSupport 是否支持更新
     * @param operName 操作人
     * @return 结果
     */
    public String importTimeSlot(List<ScTimeSlot> timeSlotList, Boolean isUpdateSupport, String operName);
}